// 注：这个文件被用于管理项目中所有与“SPU管理模块”有关的接口
import request from "@/utils/request";
// 从类型定义文件导入类型注解，用以描述接口返回的数据的类型↓
import type {
    typeOfResponseDataOfTheApiThatGetsSpusThatHaveBeenHad,
    TypeOfAllOfTheTrademarkInfomation,
    typeOfResponseDataOfTheApiThatGetsImagesOfAnSpu,
    typeOfResponseDataOfTheApiThatGetsSaleAttributesOfAnSpu,
    typeOfResponseDataOfTheApiThatGetAllOfSaleAttributesInThisProject,
    typeOfObjectThatRepresentsAnSpu,
    typeOfObjectThatRepresentsAnSku,
    typeOfResponseDataOfTheApiThatGetsSkuData,
} from "@/api/product/spu/type"
// 枚举在“SPU管理”模块中将会被使用到的接口地址↓
enum API {
    // 获取已有的SPU数据时需要用到的接口的地址↓
    getSpuThatHaveBeenHad_URL = "/admin/product/",
    // 获取所有的品牌信息时需要用到的接口的地址↓
    getAllOfTheTrademarkInfomation_URL = "/admin/product/baseTrademark/getTrademarkList",
    // 获取某个类目下上架中的商品的图片列表时需要用到的接口的地址↓
    getTheImageListOfAProductThatBelongsToASpecificCategory3AndIsOnSaleNow_URL = "/admin/product/spuImageList/",
    // 获取某一个SPU下面的全部的已有的销售属性时，需要用到的接口的地址↓
    getTheSalesAttributeOfASpu_URL = "/admin/product/spuSaleAttrList/",
    // 获取项目中所有的销售属性（即“颜色”、“版本”、“尺码”）时，需要用到的接口的地址↓
    getAllOfSaleAttributesInThisProject_URL = "/admin/product/baseSaleAttrList",
    // 添加一个新的SPU时，需要用到的接口的地址↓
    addANewSpu_URL = "/admin/product/saveSpuInfo",
    // 更新一个已有的SPU的信息时，需要用到的接口的地址↓
    updateTheInformationOfAnExistingSpu_URL = "/admin/product/updateSpuInfo",
    // 添加一个新的SKU时，需要用到的接口的地址↓
    addANewSku_URL = "/admin/product/saveSkuInfo",
    // 查看某个SPU下面的全部的已有的SKU时，需要用到的接口的地址↓
    previewTheInformationOfTheSkuThatBelongsToAnExistingSpu_URL = "/admin/product/findBySpuId/",
    // 删除一个已有的SPU时，需要用到的接口的地址↓
    deleteAnExistingSpu_URL = '/admin/product/deleteSpu/',
}
// 获取已有的SPU数据，向接口发送请求时需要用到的函数↓
/* export const requestSpuThatHaveBeenHad = (PageNumber:number,PageSize:number,Category3Id:string|number) => { 
    let result = request.get<any,typeOfResponseDataOfTheApiThatGetsSpusThatHaveBeenHad>(API.getSpuThatHaveBeenHad_URL + `${PageNumber}/${PageSize}?category3Id=${Category3Id}`)
    console.log(result) // Promise {<pending>}
} */
// 注：这个函数，老师在教学视频中写的“原始代码”是“export const requestSpuThatHaveBeenHad = (PageNumber:number,PageSize:number,Category3Id:string|number) => {request.get<any,typeOfResponseDataOfTheApiThatGetsSpusThatHaveBeenHad>(API.getSpuThatHaveBeenHad_URL + `${PageNumber}/${PageSize}?category3Id=${Category3Id}`)}”
// 但是可能是由于后台服务器端的原因，现在如果仍按原始代码书写该函数，如上所述↑，该函数将直接返回一个处于“pending”状态（也就是尚未被解析完毕）的Promise对象，而非原始代码中预期的“解析后的响应数据”（也就是该函数没有等待这个Promise被解析完成），导致在“SPU管理”组件中调用函数时无法获取到预期的响应数据（即浏览器执行函数“getAllOfTheSpuThatBelongsToASpecificCategory3”时，执行语句“console.log(result)”时浏览器将输出“undefined”。
// 为解决这个问题，需要使用使用“async...await”结构重构上面↑的函数，如下所示↓）
/* 注：这段内容是文心快码对上面这个问题的解释：解决“requestSpuThatHaveBeenHad”函数返回Promise的问题
1. 问题分析：从用户提供的代码和描述来看，问题出在 requestSpuThatHaveBeenHad 函数的实现上。该函数应该是一个异步函数，用于发送HTTP请求并获取服务器响应。然而，当前的实现中，函数直接返回了一个 Promise 对象，而没有等待该 Promise 解析完成。此外，函数体中的 console.log(result) 语句在 Promise 解析之前就执行了，因此打印出的是 Promise {<pending>}，表示 Promise 尚未解析。
2. 解决步骤：
2.1 修改函数为异步函数：为了使函数能够等待HTTP请求的响应，我们需要将 requestSpuThatHaveBeenHad 函数声明为异步函数，并使用 await 关键字等待 Promise 解析。
2.2 在调用处使用await：在调用 requestSpuThatHaveBeenHad 函数的地方，也需要使用 await 关键字来等待响应。这通常意味着调用该函数的地方也需要是一个异步函数。
2.3 确保类型定义正确：确保 typeOfResponseDataOfTheApiThatGetsSpusThatHaveBeenHad 类型定义与API实际返回的数据结构完全匹配。
3. 结论：通过将 requestSpuThatHaveBeenHad 函数声明为异步函数，并使用 await 等待HTTP请求的响应，我们可以确保函数返回的是解析后的响应数据，而不是一个未解析的 Promise 对象。同时，在调用该函数的地方也需要使用 await 来等待响应。这样，您就可以在控制台中看到正确的响应数据，并且可以在代码中进一步处理这些数据。 */
// 使用“async...await”结构重构上面↑的函数↓
export const requestSpuThatHaveBeenHad = async (PageNumber: number, PageSize: number, Category3Id: string | number): Promise<typeOfResponseDataOfTheApiThatGetsSpusThatHaveBeenHad> => {
    try {
        let response = await request.get<any, typeOfResponseDataOfTheApiThatGetsSpusThatHaveBeenHad>(API.getSpuThatHaveBeenHad_URL + `${PageNumber}/${PageSize}?category3Id=${Category3Id}`);
        console.log(response); // 应该打印出解析后的响应数据（实际输出内容为：{code: 200, message: '成功', data: {…}, ok: true}）
        return response;
    } catch (error) {
        console.error('获取SPU失败', error);
        throw error; // 重新抛出错误，以便调用者可以处理
    }
}
// 获取所有的品牌信息，向接口发送请求时需要用到的函数↓
export const requestAllOfTheTrademarkInfomation = async () => {
    try {
        let response = await request.get<any, TypeOfAllOfTheTrademarkInfomation>(API.getAllOfTheTrademarkInfomation_URL)
        console.log(response) // 应该打印出解析后的响应数据（实际输出内容为：{code: 200, message: '成功', data: Array(1859), ok: true}）
        return response;
    } catch (error) {
        console.error('获取品牌信息失败', error); // 捕获并打印错误信息，以便调试和错误处理（控制台中输出“获取品牌信息失败 AxiosError {message: 'timeout of 5000ms exceeded', name: 'AxiosError', code: 'ECONNABORTED', config: {…}, request: XMLHttpRequest, …}”）
        throw error
    }
}
// 获取某一个SPU下面的全部在售商品的图片列表，向接口发送请求时需要用到的函数↓
export const requestTheImageListOfAProductThatBelongsToASpecificCategory3AndIsOnSaleNow = async (spuId: number) => {
    try {
        let response = await request.get<any, typeOfResponseDataOfTheApiThatGetsImagesOfAnSpu>(API.getTheImageListOfAProductThatBelongsToASpecificCategory3AndIsOnSaleNow_URL + spuId)
        console.log(response)
        return response
    } catch (error) {
        console.error('获取商品图片列表失败', error);
        throw error
    }
}
// 获取某一个SPU下面的全部的已有的销售属性，向接口发送请求时需要用到的函数↓
export const requestTheSalesAttributeOfASpu = async (spuId: number) => {
    try {
        let response = await request.get<any, typeOfResponseDataOfTheApiThatGetsSaleAttributesOfAnSpu>(API.getTheSalesAttributeOfASpu_URL + spuId)
        console.log(response)
        return response
    } catch (error) {
        console.error('获取某个SPU的销售属性失败', error);
        throw error
    }
}
// 获取项目中所有的销售属性（即“颜色”、“版本”、“尺码”），向接口发送请求时需要用到的函数↓
export const requestAllOfSaleAttributesInThisProject = async () => {
    try {
        let response = await request.get<any, typeOfResponseDataOfTheApiThatGetAllOfSaleAttributesInThisProject>(API.getAllOfSaleAttributesInThisProject_URL)
        console.log(response)
        return response
    } catch (error) {
        console.error('获取项目中的全部销售属性失败', error);
        throw error
    }
}
/**
 * 函数“requestAddANewSpuOrUpdateTheInformationOfAnExistingSpu”被用于添加一个新的SPU或更新一个已有的SPU的信息
 * @param spuInfo SPU的信息
 */
export const requestAddANewSpuOrUpdateTheInformationOfAnExistingSpu = async (spuInfo: typeOfObjectThatRepresentsAnSpu) => {
    if (spuInfo.id) {
        try { // 注：由于服务器只返回了状态码和提示“添加成功”的消息，而没有返回数据，所以这里使用了“any”类型（添加SPU时与此相同）↓
            let response = await request.post<any, any>(API.updateTheInformationOfAnExistingSpu_URL, spuInfo)
            console.log(response)
            return response
        } catch (error) {
            console.error('更新已有的SPU的信息失败', error);
            throw error
        }
    } else {
        try {
            let response = await request.post<any, any>(API.addANewSpu_URL, spuInfo)
            console.log(response)
            return response
        } catch (error) {
            console.error('添加新的SPU失败', error);
            throw error
        }
    }
}
/**
 * 函数“requestAddANewSku”被用于添加一个新的SKU
 * @param skuInfo SKU的信息
 * @returns 
 */
export const requestAddANewSku = async (skuInfo: typeOfObjectThatRepresentsAnSku) => {
    try {
        let response = await request.post<any, any>(API.addANewSku_URL, skuInfo)
        console.log(response)
        return response
    } catch (error) {
        console.error('添加新的SKU失败', error);
        throw error
    }
}
export const requestTheSkuListUnderAnExistingSpu = async (spuId: number | string) => {
    try {
        let response = await request.get<any,typeOfResponseDataOfTheApiThatGetsSkuData>(API.previewTheInformationOfTheSkuThatBelongsToAnExistingSpu_URL + spuId)
        console.log(response)
        return response
    } catch (error) {
        console.error('获取某个SPU下的SKU列表失败', error);
        throw error
    }
}
export const requestDeleteAnExistingSpu = async (spuId: number | string) => {
    try {
        let response = await request.delete<any, any>(API.deleteAnExistingSpu_URL + spuId)
        console.log(response)
        return response
    } catch (error) {
        console.error('删除已有的SPU失败', error);
        throw error
    }
}